#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 1024
#pragma region 基础定义
typedef struct
{
    int data[MAXSIZE];
    int top;
} SeqStack;
#pragma endregion
#pragma region 【算法2 - 18】栈初始化(置空栈) 算法
SeqStack *Init_SeqStack()
{
    SeqStack *s;
    s = (SeqStack *)malloc(sizeof(SeqStack)); //申请栈空间
    if (!s)
    {
        printf("空间不足\n");
        return NULL; //未申请到足够大的存储空间，返回空指针
    }
    else
    {
        s->top = -1; //初始化栈顶指针
        return s;    //申请到栈空间，返回栈空间地址
    }
}
#pragma endregion
#pragma region 【算法2 - 19】判栈空算法
int Empty_SeqStack(SeqStack *s)
{
    if (s->top == -1)
        return 1; //空栈返回1
    else
        return 0;
}
#pragma endregion
#pragma region 【算法2 - 20】入栈算法

int Push_SeqStack(SeqStack *s, int x)
{
    if (s->top == MAXSIZE - 1)
        return 0; //栈满不能入栈，返回错误代码0
    else
    {
        s->top++;            //栈顶指针向上移动
        s->data[s->top] = x; //将x至入新的栈顶*/
        return 1;            //入栈成功，返回成功代码1
    }
}
#pragma endregion
#pragma region 【算法2 - 21】出栈算法
int Pop_SeqStack(SeqStack *s, int *x)
{ //通过*x返回原栈顶元素
    if (Empty_SeqStack(s))
        return 0; //栈空不能出栈，返回错误代码0
    else
    {
        *x = s->data[s->top]; //保存栈顶元素值
        s->top--;             //栈顶指针向下移动
        return 1;             //返回成功代码1
    }
}
#pragma endregion
#pragma region 【算法2 - 22】取栈顶元素算法
int Top_SeqStack(SeqStack *s, int *x)
{ //仅是读取栈顶元素，栈顶指针不发生变化
    //栈顶元素可以通过参数返回
    if (Empty_SeqStack(s))
        return 0; //栈空无元素
    else
    {
        *x = s->data[s->top];
        return 1;
    }
}
#pragma endregion

